package com.gep.session.impl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.hibernate.ejb.HibernateEntityManager;

import com.gep.dto.EquipamentoDTO;
import com.gep.dto.PecaDTO;
import com.gep.entity.Equipamento;
import com.gep.entity.Peca;
import com.gep.session.PecaBORemota;
import com.gep.util.Conversor;

@Stateless(mappedName = "ejb/gep/PecaBORemota")
public class PecaBO implements PecaBORemota {

	private static final Logger LOGGER = Logger.getLogger(PecaBO.class);

	@PersistenceContext
	private EntityManager em;

	public List<PecaDTO> buscarPecas(PecaDTO pecaDTO) {
		List<PecaDTO> pecasDto = new ArrayList<PecaDTO>();
		List<Peca> pecas;

		Peca pecaBuscada = new Peca();
		pecaBuscada = (Peca) Conversor.converter(pecaDTO, pecaBuscada
				.getClass().getName());
		pecas = this.buscarPecasEntity(pecaBuscada);

		for (Peca peca : pecas) {

			PecaDTO dto = (PecaDTO) Conversor.converter(peca, new PecaDTO()
					.getClass().getName());
			pecasDto.add(dto);

		}

		return pecasDto;

	}

	@SuppressWarnings("unchecked")
	private List<Peca> buscarPecasEntity(Peca peca) {
		Criteria criteria;
		List<Peca> list;
		Session session;
		HibernateEntityManager hem;

		hem = (HibernateEntityManager) this.em.getDelegate();
		session = hem.getSession();
		criteria = session.createCriteria(Peca.class);

		if (peca.getCodPeca() != null) {
			criteria.add(Restrictions.idEq(peca.getCodPeca()));
		}
		if (peca.getNomePeca() != null) {
			if (peca.getNomePeca().length() != 0) {
				criteria.add(Restrictions.eq("nomePeca", peca.getNomePeca()));
			}
		}

		if (peca.getCodPecaEmp() != null) {
			if (peca.getCodPecaEmp().length() != 0) {
				criteria.add(Restrictions
						.eq("codPecaEmp", peca.getCodPecaEmp()));
			}
		}

		if (peca.getNumSerie() != null) {
			if (peca.getNumSerie().length() != 0) {
				criteria.add(Restrictions.eq("numSerie", peca.getNumSerie()));
			}
		}
		if (peca.getEquipamento().getCodEquipamento() != null) {
			criteria.add(Restrictions.eq("equipamento", peca.getEquipamento()));
		}
		list = criteria.list();
		return list;
	}

	public void apagarPeca(PecaDTO pecaDTO) {
		Peca peca = (Peca) Conversor.converter(pecaDTO, new Peca().getClass()
				.getName());
		peca = em.find(peca.getClass(), peca.codPeca);
		em.remove(peca);
	}

	public void salvarPeca(PecaDTO pecaDTO) {
		Peca peca = (Peca) Conversor.converter(pecaDTO, new Peca().getClass()
				.getName());
		if (peca.getCodPeca() == null) {
			this.em.persist(peca);
		} else {
			this.em.merge(peca);
		}
	}

	public List<PecaDTO> buscarPecaEstoqueMinimo() {
		List<PecaDTO> pecasDTO = new ArrayList<PecaDTO>();
		Query query;
		query = em
				.createQuery("SELECT p FROM Peca p WHERE p.qtdMinima >= p.qtdEstoque");
		List<Peca> pecas = query.getResultList();
		for (Peca peca : pecas) {
			PecaDTO pecaDTO = (PecaDTO) Conversor.converter(peca, new PecaDTO()
					.getClass().getName());
			pecasDTO.add(pecaDTO);
		}
		return pecasDTO;
	}

	public void entradaPecas(PecaDTO pecaDTO, Integer quantidade) {
		Integer quantidadeAtual = pecaDTO.getQtdEstoque();
		pecaDTO.setQtdEstoque(quantidadeAtual + quantidade);
		Peca peca = (Peca) Conversor.converter(pecaDTO, Peca.class.getName());
		em.merge(peca);
	}

	public void saidaPecas(PecaDTO pecaDTO, Integer quantidade) {
		Integer quantidadeAtual = pecaDTO.getQtdEstoque();
		pecaDTO.setQtdEstoque(quantidadeAtual - quantidade);
		Peca peca = (Peca) Conversor.converter(pecaDTO, Peca.class.getName());
		em.merge(peca);
	}
	
	public List<PecaDTO> buscarPecasPorEquipamento(EquipamentoDTO equipamentoDTO){
		
		List<PecaDTO> listaPecaDTOs = new ArrayList<PecaDTO>();
		
		Equipamento equipamento = em.find(Equipamento.class, equipamentoDTO.getCodEquipamento());
		
		Query query;
		query = em
				.createQuery("SELECT p FROM Peca p WHERE p.equipamento = :pEquipamento");
		query.setParameter("pEquipamento", equipamento);
		
		List<Peca> listaPecas = query.getResultList();
		
		for (Peca peca : listaPecas) {
			PecaDTO pecaDTO = (PecaDTO)Conversor.converter(peca, PecaDTO.class.getName());
			listaPecaDTOs.add(pecaDTO);
		}
		
		
		return listaPecaDTOs;
	}

}
